如昨天所說,目前 Gosh 的 prompt 真的太醜了,就只有一個簡單的 >
,連路徑都沒有顯示,根本不知道怎麼用
看看隔壁棚的 zsh,不僅該有的功能都有,甚至還加上了顏色,看起來就賞心悅目,看到這麼美的終端機一整天的心情都好了起來
醜不拉嘰的 Gosh,連作者我本人都不忍直視
五彩繽紛、科技感十足的 Zsh
所謂「人要衣裝,佛要金裝」,就算功能輸給 Zsh 也不可以長得太醜,所以今天要來給他大改造,至少改善一下第一印象XD
如上面 zsh 的圖,如果要做出好看的 prompt 就會需要 username、hostname 等等資訊,因為這些資料是在系統內部,所以一定要透過 System Call 跟系統拿(下圖 System Calls 箭頭)
以下三個 function 就是已經包裝好的 System Call,只要使用這些 function,Go 就會自動處理跟系統溝通的部分,開發者只要負責用就可以了,簡單吧~
os.Getwd()
os
是負責 Operating System(作業系統)相關操作的 package,裡面放的都是包裝好的 System Call,其中 os.Getwd()
是用來取得目前路徑(Working Directory),相當於 pwd
指令
os.Hostname()
os.Hostname()
就是字面上的意思:用來跟 OS(Operating System) 要這台電腦的主機名稱,相當於 hostname
指令做的事情
user.Current()
os/user
是 Go 中處理使用者資訊相關的 package,他也是 os
的 subpackage,其中的 user.Current
可以取得目前使用者的資訊,相當於 whoami
指令
showPrompt
因為 prompt 的內容越來越複雜,所以把 prompt 的部分獨立出來
func showPrompt() {
u, _ := user.Current() // 取得使用者資訊
host, _ := os.Hostname() // 取得主機名稱
wd, _ := os.Getwd() // 取得 Working Directory
// 把字串組合起來放到 Prompt 中
fmt.Printf("%s@%s %s > ", u.Username, host, wd)
}
func main() {
stdin := bufio.NewReader(os.Stdin)
for {
showPrompt()
// ...
}
}
終於有目前路徑了~~
今天稍微講了 System Call 的觀念,因為 Go 都已經包裝好了所以實作上沒什麼難度,就只是使用 System Call 取得想要的資訊並且呈現出來,commit 放在 這邊 請有需要的客倌自行取用
雖然 prompt 有好看一點了,但跟 zsh 比起來好像還少了點生命力,我想一定是顏色的關係對吧!既然如此明天就來幫Shell上色吧~~